package api.basecamp;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import sun.misc.BASE64Encoder;
/***
* Base for building out BaseCamp Entities
*
* Includes Basic REST Operations with Authentication
*
* @author jondavidjohn
*/
abstract class BaseCampEntity {
//--- User / Company Authentication information
private String username;
private String password;
private String baseUrl;
protected BaseCampEntity(BCAuth auth) {
this.username = auth.username;
this.password = auth.password;
this.baseUrl = auth.company+".basecamphq.com";
//Attach http/https
if (auth.useSsl) { this.baseUrl = "https://"+baseUrl; }
else { this.baseUrl = "http://"+baseUrl; }
}
//--- Base REST interaction methods
/***
* GET HTTP Operation
*
* @param request Request URI
* @return Element Root Element of XML Response
*/
protected Element get(String request) {
HttpURLConnection connection = null;
Element rootElement;
try {
URL url = new URL(this.baseUrl + request);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
BASE64Encoder enc = new sun.misc.BASE64Encoder();
String userpassword = this.username + ":" + this.password;
String encodedAuthorization = enc.encode( userpassword.getBytes() );
connection.setRequestProperty("Authorization", "Basic "+ encodedAuthorization);
connection.setRequestProperty("Content-type", "application/xml");
connection.setRequestProperty("Accept", "application/xml");
InputStream responseStream = connection.getInputStream();
//--- Parse XML response InputStream into DOM
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(responseStream);
rootElement = doc.getDocumentElement();
} catch(Exception e) {
System.out.print(e.toString());
rootElement = null;
} finally {
if(connection != null) {
connection.disconnect();
}
}
return rootElement;
}
/***
* POST HTTP Operation
*
* @param request Request URI
* @param POST Data in String form
* @return int ID of inserted (posted) element
*/
protected int post(String requestURL, String requestData) {
HttpURLConnection connection = null;
int itemID;
try {
URL url = new URL(this.baseUrl + requestURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
BASE64Encoder enc = new sun.misc.BASE64Encoder();
String userpassword = this.username + ":" + this.password;
String encodedAuthorization = enc.encode( userpassword.getBytes() );
connection.setRequestProperty("Authorization", "Basic "+ encodedAuthorization);
connection.setRequestProperty("Content-type", "application/xml");
connection.setRequestProperty("Accept", "application/xml");
//--- Send POST data
connection.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
wr.write(requestData);
wr.flush();
wr.close();
String responseHeader = connection.getHeaderField(0);
String[] headerArray = responseHeader.split(" ");
int responseCode = Integer.parseInt(headerArray[1]);
if (responseCode == 201) {
String locationURL = connection.getHeaderField("Location");
String[] locationArray = locationURL.split("/");
itemID = Integer.parseInt(locationArray[locationArray.length - 1].replace(".xml",""));
}
else {
itemID = 0;
}
} catch(Exception e) {
System.out.print(e.toString());
itemID = 0;
} finally {
if(connection != null) {
connection.disconnect();
}
}
return itemID;
}
/***
* PUT HTTP OPERATION
*
* @param request Request URI
* @param POST Data in String form
* @return Boolean if operation was successful
*/
protected boolean put(String requestURL, String requestData) {
HttpURLConnection connection = null;
boolean response;
try {
URL url = new URL(this.baseUrl + requestURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("PUT");
BASE64Encoder enc = new sun.misc.BASE64Encoder();
String userpassword = this.username + ":" + this.password;
String encodedAuthorization = enc.encode( userpassword.getBytes() );
connection.setRequestProperty("Authorization", "Basic "+ encodedAuthorization);
connection.setRequestProperty("Content-type", "application/xml");
connection.setRequestProperty("Accept", "application/xml");
//--- Send POST data
connection.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
wr.write(requestData);
wr.flush();
wr.close();
String responseHeader = connection.getHeaderField(0);
String[] headerArray = responseHeader.split(" ");
int responseCode = Integer.parseInt(headerArray[1]);
if (responseCode == 200) {
response = true;
}
else {
response = false;
}
} catch(Exception e) {
System.out.print(e.toString());
response = false;
} finally {
if(connection != null) {
connection.disconnect();
}
}
return response;
}
/***
* DELETE HTTP OPERATION
*
* @param request Request URI
* @return Boolean success
*/
protected boolean delete(String request) {
HttpURLConnection connection = null;
boolean response;
try {
URL url = new URL(this.baseUrl + request);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
BASE64Encoder enc = new sun.misc.BASE64Encoder();
String userpassword = this.username + ":" + this.password;
String encodedAuthorization = enc.encode( userpassword.getBytes() );
connection.setRequestProperty("Authorization", "Basic "+ encodedAuthorization);
connection.setRequestProperty("Content-type", "application/xml");
connection.setRequestProperty("Accept", "application/xml");
String responseHeader = connection.getHeaderField(0);
String[] headerArray = responseHeader.split(" ");
int responseCode = Integer.parseInt(headerArray[1]);
if (responseCode == 200) {
response = true;
}
else {
response = false;
}
} catch(Exception e) {
System.out.print(e.toString());
response = false;
} finally {
if(connection != null) {
connection.disconnect();
}
}
return response;
}
}